package 线程1;
//  并发编程能够提高程序的效率
//可以观察多线程在一些场合下是可以提高程序的整体运行效率的。
//        使用 System.nanoTime() 可以记录当前系统的 纳秒 级时间戳.
//        使用 System.currentTimeMillis();可以记录当前系统 毫秒 级时间戳
//        serial 串行的完成一系列运算. concurrency 使用两个线程并行的完成同样的运算
public class TheadDemo7 {
    private static final long count = 10_0000_0000L;
    //长整型数值有一个后缀L或者l.而对于float应该有个F或者f.(小数默认是double类型,java是强语言类型)
    public static void serial(){
        long beg = System.currentTimeMillis();
        int a = 0;
        for (int i = 0; i < count; i++) {
            a++;
        }
        int b = 0;
        for (int i = 0; i < count; i++) {
            b++;
        }
        long end = System.currentTimeMillis();
        System.out.println("time: "+(end-beg));
    }
    public static void concurrency(){
        //线程1
        long beg = System.currentTimeMillis();
        Thread t1 = new Thread(){
            @Override
            public void run() {
                int a = 0;
                for (int i = 0; i < count; i++) {
                    a++;
                }
            }
        };
        t1.start();
        //线程2
        Thread t2 = new Thread(){
            @Override
            public void run() {
                int b = 0;
                for (int i = 0; i < count; i++) {
                    b++;
                }
            }
        };
        t2.start();
        //下面是主线程
        //需要保证t1,t2都执行完之后
        //再结束计时
        try {
            //join就是等待对应线程的结束
            //当t1,t2都没执行完之前,join方法就会阻塞等待
            t1.join();
            t2.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        long end = System.currentTimeMillis();
        System.out.println("time: "+(end-beg));
    }
    public static void main(String[] args) {
//        使用串行的方式
//        serial();
//        使用并行的方式
//        concurrency();
        /**
         * 一个线程执行了20亿次循环,中间可能会调度若干次.(会花一定时间)
         * 两个线程各自执行10亿次循环.中间也可能会调度若干次.(也会话一定时间)
         *
         * 而这所花的时间是无法确定的
         */

        /**
         * 资源共享:
         * 1.内存
         * 同一个进程里的若干个线程可以访问同一份内存
         * 2.文件
         * 线程1打开的文件,线程2也能使用(以后再说)
         *
         * 变量就是内存,两个线程能共同访问同一个变量,这两线程在使用同一份内存
         * 而对于多进程来说,进程1无法访问进程2的变量
         */
    }
}
